package top.zhangjianyong.tools.indicator.model;

import lombok.Data;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

/**
 * 技术指标计算结果对象
 * 统一的结果对象，用于类型安全地存储各种指标的计算结果
 *
 * @author zhangjianyong
 * @date 2024/01/01
 */
@Data
public class TechnicalIndicatorResult {

    /**
     * 指标名称
     */
    private String indicatorName;

    /**
     * 计算结果值，使用Map存储多个值（如MACD包含dif、dea、macd三个值）
     * 键名示例：{"rsi": 65.5, "rsi_14": 65.5} 或 {"macd_dif": 0.5, "macd_dea": 0.3, "macd": 0.2}
     */
    private Map<String, Object> values;

    /**
     * 计算是否成功
     */
    private boolean success;

    /**
     * 错误信息（计算失败时）
     */
    private String errorMessage;

    /**
     * 计算时间
     */
    private LocalDateTime calculateTime;

    public TechnicalIndicatorResult() {
        this.values = new HashMap<>();
        this.success = false;
        this.calculateTime = LocalDateTime.now();
    }

    public TechnicalIndicatorResult(String indicatorName) {
        this();
        this.indicatorName = indicatorName;
    }

    /**
     * 创建成功的结果对象
     *
     * @param indicatorName 指标名称
     * @return 成功的结果对象
     */
    public static TechnicalIndicatorResult success(String indicatorName) {
        TechnicalIndicatorResult result = new TechnicalIndicatorResult(indicatorName);
        result.setSuccess(true);
        return result;
    }

    /**
     * 创建失败的结果对象
     *
     * @param indicatorName 指标名称
     * @param errorMessage  错误信息
     * @return 失败的结果对象
     */
    public static TechnicalIndicatorResult failure(String indicatorName, String errorMessage) {
        TechnicalIndicatorResult result = new TechnicalIndicatorResult(indicatorName);
        result.setSuccess(false);
        result.setErrorMessage(errorMessage);
        return result;
    }

    /**
     * 添加计算结果值
     *
     * @param key   键名
     * @param value 值
     */
    public void addValue(String key, Object value) {
        this.values.put(key, value);
    }

    /**
     * 获取计算结果值
     *
     * @param key 键名
     * @return 值
     */
    public Object getValue(String key) {
        return values.get(key);
    }

    /**
     * 获取BigDecimal类型的值
     *
     * @param key 键名
     * @return BigDecimal值，如果不存在或类型不匹配则返回null
     */
    public BigDecimal getBigDecimalValue(String key) {
        Object value = values.get(key);
        if (value == null) {
            return null;
        }
        if (value instanceof BigDecimal) {
            return (BigDecimal) value;
        }
        if (value instanceof Number) {
            return BigDecimal.valueOf(((Number) value).doubleValue());
        }
        return null;
    }

    /**
     * 获取Double类型的值
     *
     * @param key 键名
     * @return Double值，如果不存在或类型不匹配则返回null
     */
    public Double getDoubleValue(String key) {
        Object value = values.get(key);
        if (value == null) {
            return null;
        }
        if (value instanceof Number) {
            return ((Number) value).doubleValue();
        }
        return null;
    }

    /**
     * 获取Integer类型的值
     *
     * @param key 键名
     * @return Integer值，如果不存在或类型不匹配则返回null
     */
    public Integer getIntValue(String key) {
        Object value = values.get(key);
        if (value == null) {
            return null;
        }
        if (value instanceof Number) {
            return ((Number) value).intValue();
        }
        return null;
    }
}

